{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "导入一些用到的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.ERROR)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    训练集中有55000条数据；\n",
    "    验证集中有5000条数据；\n",
    "    测试集中有10000条数据；\n",
    "    每条数据784维（28x28的图像）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面显示部分图片和对应的标签看看，标签应该对于图片中的数字"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "定义训练网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 先定义网络的输入，包括：\n",
    "    1) 训练数据集x，数据类型float，第一个纬度是数据条数，由运行时每次输入的数量(batchsize)决定，这里设置为None，第二个纬度是数据特征数，这里是图像的像素数量784\n",
    "    2) 训练数据的标签y, 数据类型int64\n",
    "    3) 学习率learning_rate，数据类型float"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. 接下来定义网络结构"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    这里定义了一个两层网络（1个隐层+1个输出层），结构上采用全连接结构：\n",
    "    1) 第一层网络有100个神经元，网络定义： \n",
    "        1. 权重矩阵W_1：其第一维数量为这一层的输入数量，即数据的纬度784，第二维数量是本层神经元数量L1_units_count=100，使用truncated_normal初始化，标准差这里设置为0.1\n",
    "        2. 本层的bias向量b_1：数量为本层神经元数L1_units_count=100\n",
    "        3. 定义本层神经元运算：logits_1 = x * W_1 + b_1\n",
    "        4. 使用RELU激活函数生成本层的输出output_1: output_1 = tf.nn.relu(logits_1)\n",
    "    2) 定义第二层网络，因为是输出层，所以其神经元数量与输出数量相等，这里做手写数字识别要输出0-9的分类标签，为10个输出，所以第二层神经元数量L2_units_count=10，网络定义：\n",
    "        1. 权重矩阵W_2：其第一维数量为这一层的输入数量，即上一层输出数量L1_units_count=100，第二维数量是本层神经元数量L2_units_count=10，同样使用truncated_normal初始化，标准差为0.1\n",
    "        2. 本层的bias向量b_2：数量为本层神经元数L2_units_count=10\n",
    "        3. 定义本层神经元运算：logits_2 = output_1 * W_2 + b_2\n",
    "        4. 分类应用softmax激活，这里先不激活，在后面评估时会应用softmax\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. 接下来定义loss和用于优化网络的优化器\n",
    "    loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. 将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    先应用softmax得到分类结果，然后使用argmax得到分类对应的数字，与ground_truth进行比较判断每一条数据结果是否正确，最后计算模型的准确率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上完成tf的符号计算的计算定义tf.Graph，这些将作为缺省的graph使用"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来使用前面定义的计算进行网络模型训练，每次使用32条数据(batch_size)训练，共1000次(traning_step)\n",
    "这里定义了一个Saver对象，用于保存模型训练的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.56481, the validation accuracy is 0.8632\n",
      "after 200 training steps, the loss is 0.484801, the validation accuracy is 0.8832\n",
      "after 300 training steps, the loss is 0.412704, the validation accuracy is 0.9222\n",
      "after 400 training steps, the loss is 0.297627, the validation accuracy is 0.9316\n",
      "after 500 training steps, the loss is 0.172887, the validation accuracy is 0.9348\n",
      "after 600 training steps, the loss is 0.133293, the validation accuracy is 0.934\n",
      "after 700 training steps, the loss is 0.410289, the validation accuracy is 0.9436\n",
      "after 800 training steps, the loss is 0.0744114, the validation accuracy is 0.9484\n",
      "after 900 training steps, the loss is 0.651847, the validation accuracy is 0.9468\n",
      "after 1000 training steps, the loss is 0.132919, the validation accuracy is 0.9556\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9508\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if (i+1) % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i+1, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i+1)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    以上代码首先定义一个Sessoin对象sess, 使用缺省graph，即前面我们定义的网络，损失函数和优化方法\n",
    "    分为1000次，每次使用32条数据进行训练，每100次用验证集进行一次验证，并保存模型的状态\n",
    "    训练完成后用测试集进行测试，并打印测试结果的准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "    最后对训练结果进行可视化的观察分析：\n",
    "    创建一个新的Session，读取之前训练的模型\n",
    "    取测试集的前16条数据进行测试，打印准确率；\n",
    "    对结果进行可视化输出，可以看出大部分识别正确，个别比较夸张的识别错误，例如上图中的第三行第一列的5识别成了6"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上模型最终在测试集上达到95%左右的准确率，测试集和验证集准确率接近，没有过拟合现象；\n",
    "从log看，训练后期收敛慢；可以通过尝试调整学习率看是否有改善\n",
    "准确率低的几点可能原因：\n",
    "1. 网络简单，学习不到全部的特征\n",
    "2. 学习数据少，没有使用全部的训练数据，目前仅使用了32000条数据\n",
    "3. 没有使用dropout和正则, 可能学习到了一些干扰特征"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
